﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace _059
{
    /// <summary>
    /// 使用Mutex或lock对象来同步两个线程。其中一个线程负责打印偶数，另一个线程负责打印奇数。线程在执行任务之前会锁定共享的Mutex或lock对象，以确保每个线程执行任务时只有一个线程能够访问共享资源
    /// </summary>
    internal class Program
    {
        static Mutex mutex = new Mutex();
        static int count = 1;
        static void Main(string[] args)
        {
            Thread t1 = new Thread(PrintOddNumber);//定义线程T1
            Thread t2 = new Thread(PrintEvenNumbers);//定义线程T2
            t1.Start();//开始执行线程T1
            t2.Start();
            t1.Join();//在继续执行标准的COM和SendMessage消息泵处理期间，阻塞调用线程，直到某个线程终止为止。此方法有不同的重载形式
            t2.Join();
            Console.ReadLine();
            Console.WriteLine();
            Console.ReadKey();
        }
        static void PrintOddNumber()//打印奇数方法
        {
            while (count <= 100)
            {
                mutex.WaitOne();
                if(count %2==1)
                {
                    Console.WriteLine("Thread 奇数:"+count);
                    count++;
                }
                mutex.ReleaseMutex();
            }
        }
        static void PrintEvenNumbers()//打印偶数方法
        {
            while(count<=100)
            {
                mutex.WaitOne();
                if(count %2==0)
                {
                    Console.WriteLine("Thread 偶数:"+count);
                    count++;
                }
                mutex.ReleaseMutex();
            }
        }
    }
}
